package string

import (
	"strings"
)

//罗马数字转整数
/*
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

 */
func RomonToInt(s string) int {
	//把4 9 40 90 400 900 都单独替换一下
	s=strings.ReplaceAll(s,"IV","Q")//4
	s=strings.ReplaceAll(s,"IX","W")//9
	s=strings.ReplaceAll(s,"XL","E")//40
	s=strings.ReplaceAll(s,"XC","R")//90
	s=strings.ReplaceAll(s,"CD","T")//400
	s=strings.ReplaceAll(s,"CM","Y")//900
	//建立所有字符的映射
	m:=make(map[string]int)
	m["I"]=1
	m["V"]=5
	m["X"]=10
	m["L"]=50
	m["C"]=100
	m["D"]=500
	m["M"]=1000
	m["Q"]=4
	m["W"]=9
	m["E"]=40
	m["R"]=90
	m["T"]=400
	m["Y"]=900
	ret:=0
	for _,i:=range []rune(s){
		n,_:=m[string(i)]
		ret+=n
	}
	return ret
}
//验证无效括号
//主要是利用了栈的概念 , 先进后出, 遍历到左括号,把右括号进栈
//遍历到右括号就往外弹,看看两个是不是一致
func ValidKuohao(s string) bool{
	str:=[]rune(s)
	if len(str)<=1{
		return false
	}
	//初始化栈
	stack:=[]string{}
	//循环字符
	for _,i:=range str{
		item:=string(i)
		//如果是遇到左括号 , 就把右括号入栈
		if item=="("{
			stack=append(stack,")")
		}else if item=="{"{
			stack=append(stack,"}")
		}else if item=="["{
			stack=append(stack,"]")
		}else{
			if len(stack)==0{
				return false
			}
			//如果遇到了右括号 , 就判断栈顶的元素是否和当前一致
			top:=stack[len(stack)-1]
			if top!=item{
				return false
			}
			//如果一致就弹出栈 , 继续后面的判断
			stack=stack[0:len(stack)-1]
		}
	}
	//如果栈内还有数据 , 说明没有全部匹配光 , 也是false
	if len(stack)!=0 {
		return false
	}
	return true
}